package com.likianta.anykey;

import android.content.Context;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * Created by Likianta_Dodoora on 2018/1/9 0009.
 */

public class Page2 extends Fragment implements View.OnClickListener {
    
    // 使用黄油刀绑定控件
    @BindView(R.id.page2_edt_1)
    EditText edt1;
    @BindView(R.id.page2_edt_2)
    EditText edt2;
    @BindView(R.id.page2_edt_3)
    EditText edt3;
    @BindView(R.id.page2_edt_5)
    EditText edt4;
    @BindView(R.id.page2_btn_1)
    TextView btn1;
    @BindView(R.id.page2_btn_2)
    TextView btn2;
    @BindView(R.id.page2_btn_3)
    TextView btn3;
    @BindView(R.id.page2_btn_4)
    TextView btn4;
    @BindView(R.id.page2_mask)
    ImageView mask;
    @BindView(R.id.page2_popup_panel_1)
    RecyclerView popupPanel1;
    
    private View page2;
    private Fragment fragment;
    private FragmentManager manager;
    private int STATE = 0;
    private Unbinder unbinder; // unBinder的作用在销毁事件中有说明
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
            savedInstanceState) {
        page2 = inflater.inflate(R.layout.page2, container, false);
        unbinder = ButterKnife.bind(this, page2); // 这里执行了两个事件：一是完成了碎片与黄油刀的绑定，二是返回值递给了unBinder
        
        return page2;
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        manager = getChildFragmentManager();
        
        // 监听所有的点击事件
        addListeners();
    }
    
    public void addListeners() {
        
        // 监听按钮点击
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        mask.setOnClickListener(this);
        
        edt1.addTextChangedListener(new TextWatcher() {
            // [addTextChangedListener（文本监听）参数解释及实现EditText字数监听 - CSDN博客](http://blog.csdn
            // .net/qq_35253767/article/details/52457443)
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            
            }
            
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            
            }
            
            @Override
            public void afterTextChanged(Editable s) {
                if (s.toString().length() != 0) {
                    // [Android在代码中引用colors资源的方法](https://likianta.coding
                    // .me/2018/android-abc/0113210338/)
                    btn4.setTextColor(getResources().getColor(R.color.blaTextNormal));
                } else {
                    btn4.setTextColor(getResources().getColor(R.color.blaTextWeak));
                }
            }
        });
        
    }
    
    @Override
    public void onClick(View v) {
        
        PlayAnimations play = new PlayAnimations(getContext());
        
        /*
        代码工作：
          1. chevron检测当前状态，如果当前为初始状态，则执行激活操作；如果当前是激活状态（非零状态），则进行重置操作
          2. 激活操作：
            1. 变更状态码为非零数值
            2. 遮罩动画in
            3. 按钮动画in
            4. 按钮抬升到遮罩之上（代码在动画中）
            5. 编辑框抬升到遮罩之上
            6. 如果软键盘存在，则将其隐藏
            6. 引入相应的碎片布局（详见`setFragIntoSandbox()`方法）
          3. 重置操作：详见 resetLayout() 方法
        */
        
        switch (v.getId()) {
            case R.id.page2_mask:
                if (mask.getVisibility() == View.VISIBLE) {
                    play.outPlayMask(mask);
                    popupPanel1.setVisibility(View.GONE);
                    STATE = 0;
                }
                break;
            case R.id.page2_btn_1:
                if (STATE == 0) {
                    STATE = 1;
                    play.inPlayMask(mask);
                    hideKeyboard();
                    
                    // test
                    final List<Group> groups = new ArrayList<>();
                    groups.add(new Group(1, R.drawable.shape_rnd_1, "UNCLASSIFIED"));
                    groups.add(new Group(2, R.drawable.shape_rnd_2, "GAME"));
                    groups.add(new Group(3, R.drawable.shape_rnd_3, "SOCIAL"));
    
                    popupPanel1.setVisibility(View.VISIBLE);
                    final GroupAdapter adapter = new GroupAdapter(groups);
                    popupPanel1.setLayoutManager(new LinearLayoutManager(getContext()));
                    popupPanel1.setAdapter(adapter);
                } else {
                    play.outPlayMask(mask);
                    popupPanel1.setVisibility(View.GONE);
                    STATE = 0;
                }
                break;
            case R.id.page2_btn_2:
                if (STATE == 0) {
                    STATE = 1;
                    play.inPlayMask(mask);
                    hideKeyboard();
        
                    // TO BE CONTINUE
                    
                } else {
                    play.outPlayMask(mask);
                    popupPanel1.setVisibility(View.GONE);
                    STATE = 0;
                }
                break;
            default:
        }
    }
    
    // 将碎片载入右分页下半部分的沙盒布局中（该布局是一个 FrameLayout 布局）
    public Fragment setFragIntoSandbox(int container, Fragment fragment) {
        
        /*
         * 代码逻辑：
         * 1. 创建一个临时的 transaction 用于接下来的业务
         * 2. 在容器中放入新的碎片
         * 3. 提交操作
         * 4. 并返回该碎片实例，用于日后的销毁权证（将在 resetLayout() 中被使用）
         */
        
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(container, fragment);
        transaction.commit();
        
        /*
         * 注意事项：为什么我不把 transaction 设为全局变量，以方便多次复用？
         * transaction 不可被定义为全局变量，因为一个 transaction 只允许执行一次 commit 操作
         * 如果令其多次执行 commit，则会发生崩溃：java.lang.IllegalStateException: commit already called
         * 参考：http://blog.csdn.net/knxw0001/article/details/9363411
         * 所以我使用的是局部变量，每次进入 setFragIntoSandbox 函数中时，就会临时 new 一个 transaction 实例进行 commit
         */
        
        return fragment;
    }
    
    
    
    // 隐藏键盘
    public void hideKeyboard() {
        /*
            试了很多隐藏软键盘的方法都没有成功，下面这个是最终测试有效的
            参考：https://www.cnblogs.com/vir56k/p/4389836.html
            
            注意三点：
            1. 从该碎片本身的 view 获取 imm
            2. 隐藏方法不要错写成 hideSoftInputFromInputMethod
            3. 隐藏方法中的参数第一个参数是从 view 中获取 token
        */
        
        InputMethodManager imm = (InputMethodManager) page2.getContext().getSystemService(Context
                .INPUT_METHOD_SERVICE);
        if (imm.isActive()) {
            imm.hideSoftInputFromWindow(page2.getWindowToken(), 0);
        }
    }
    
    public Fragment getChildFrag() {
        return fragment;
    }
    
    // 黄油刀需要在 Fragment 销毁时解绑（在 Activity 中则无需此操作）
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}
